home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
476-500
/
disk_496
/
memmometer
/
mm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
39KB
|
1,204 lines
/* : ai=0 bk=0 ts=8 */
#include "mm.h"
#define FREEPEN -1L /* workbench screen default colors */
#define REQ_WINDOW_WIDTH 319L /* width of warning requester window */
#define REQ_WINDOW_HEIGHT 79L /* height of warning requester window */
#define SOK 0x001f /* memory allocation control masks */
#define S1 0x0001
#define S2 0x0002
#define S4 0x0004
#define S8 0x0008
#define SA 0x0010
#define C1 0xfffe
#define C2 0xfffd
#define C4 0xfffb
#define C8 0xfff7
#define CA 0xffef
#define AARRRGH 20L /* hang 20, cats, we're startin ta curl! */
#define EXTENSION 16L /* allocation request increment */
#define FRAGS FALSE /* frags mode control boolian */
#define WARPS TRUE /* warps mode control boolian */
#define EVENMASK 0x7ffffffe /* used to prevent odd address traps */
#define CLIHEIGHT 200L /* window scaling stuff */
#define SIZEGAD 9L
#define DRAGBAR 10L
#define BORDER 2L
#define WINW 16L /* initial window width */
#define WINH (long)(CLIHEIGHT - SIZEGAD - DRAGBAR) /* initial win height */
#define MINH 81L /* shortest allowable window */
#define MAXH 576L /* longest allowable window */
#define BART 1L /* title bar F text location */
#define BARH (long)(WINH - SIZEGAD - DRAGBAR) /* bar height */
#define BARS (long)(BARH + 1) /* number of memory items to allocate */
#define BARB (long)(BARH + DRAGBAR - 1) /* bottom of mercury column */
#define BARE (long)(BARB + BORDER) /* bar end E text position */
#define BARW (long)(((WINW - (2 * BORDER)) / 3) - 1) /* 3 memfragmometers */
#define LEFT BORDER /* SLOW : since we're syncopated, we */
#define MIDDLE (LEFT + BARW + 1) /* SLOW-FAST : do it going from bar */
#define RIGHT (MIDDLE + BARW + 1) /* FAST :to bar at an irregular pace */
#define RTEXT - 4L /* offset for three char E/F text from left edge */
#define STARTVAL 64L /* start by getting enough storage for a few frags */
#define TMARK 100000L /* timer granule in microseconds */
#define TICKIES (long)(1000000/TMARK) /* number of TMARKS per second */
/* typedef short BOOL */ /* this is in include/exec/types.h */
struct IntuitionBase *IntuitionBase=NULL ;
struct Window *window ;
struct IntuiMessage *message;
/* struct IntuiMessage *GetMsg(); */ /* in functions.h */
struct GfxBase *GfxBase=NULL ;
struct IOStdReq *timermsg=NULL;
struct MsgPort *timerport=NULL;
ULONG timerbit=NULL;
extern void InitProjItems(); /* this stuff is in the mminit section */
extern void InitSetupItems();
extern void InitPrioItems();
extern void InitChipItems();
extern void InitChipAItems();
extern void InitSFItems();
extern void InitSFAItems();
extern void InitFastItems();
extern void InitFastAItems();
extern void InitMenu();
extern void StartMenus();
BOOL p_mode = FRAGS; /* preset frags mode = 0, warps mode = 1 */
/* note: mode preset used as request for */
/* change to warps mode after the */
/* first pass with frags mode set! */
long p_rate = 2; /* preset sample interval, secs see menu */
long p_priority = 0; /* preset priority, range -128 to +127 */
/* note: pri greater than zero is risky! */
/* keep in mind AmigaDOS priorities: */
/* input.device 20, FileSystem 10, and */
/* trackdisk.device, CON: 5 also if MM */
/* is started from a CLI without the Run */
/* then that CLI inherits MM's priority! */
long p_chip = 512; /* preset chip mem size, kbytes see menu */
long p_chipa = 0; /* preset chip mem address, kb see menu */
long p_sf = 0; /* preset slowfast mem size, kb see menu */
long p_sfa = 2048; /* preset slowfast mem addr, kb see menu */
long p_fast = 0; /* preset fast mem size, mbytes see menu */
long p_fasta = -1; /* preset fast mem addr, mbytes see menu */
/* zero or neg fasta is offset below the */
/* A3000 fast ram ceiling, aka 0x7000000 */
static BOOL mode; /* uninitialized for mode control */
static BOOL mmode; /* uninitialized for mode menu */
static long delayval; /* uninitialized for delay menu */
static long priority; /* uninitialized for priority menu */
static long lastpri; /* uninitialized for priority incr */
static long cmemsize; /* uninitialized for chip menu */
static long cmembase; /* uninitialized for chipa menu */
static long sfmemsize; /* uninitialized for sf menu */
static long sfmembase; /* uninitialized for sfa menu */
static long fmemsize; /* uninitialized for fast menu */
static long fmembase; /* uninitialized for fasta menu */
static USHORT log ; /* memory allocation success flags */
static BOOL things_are_cool = TRUE ; /* tells when to close the window */
static BOOL intsig = FALSE ; /* intuition message detector */
static USHORT chgflag = TRUE ; /* menu request to adjust columns */
static long chip[3], fast[3] ; /* place to keep mem header pointers */
static ULONG *chunkv ; /* demand allocated for frag chunks */
static ULONG *sizev ; /* demand allocated for frag sizes */
static ULONG *csum ; /* a col's height worth of checksums */
static ULONG *oldcsum ; /* same height worth of old checksums */
static USHORT *cell; /* 1 cell per pixel height of mercury */
static long xl, xr ; /* used to Draw() memmometer segments */
static long frags = STARTVAL ; /* # of demand allocated frag items */
static long warps = BARS ; /* # of demand allocated column items */
static long barh = BARH ; /* EVEN #'d height of mercury column */
static long barb = BARB ; /* bottom position of mercury column */
static short ticker = TICKIES ; /* initialized delay tick variable */
/* struct RastPort *rp ; */ /* wonder why we don't need this... ? */
static struct TextAttr myfont = {
(STRPTR) "topaz.font",
TOPAZ_EIGHTY,
0,
0
};
/* E newsize gadget refresh text */
static char ebuf[4] = " E " ;
static struct IntuiText e_text = {
BLUP, WHTP,
JAM2,
0, BARE,
&myfont,
(UBYTE *)ebuf,
NULL
};
/* F title refresh text */
static char fbuf[4] = " F " ;
static struct IntuiText f_text = {
BLUP, WHTP,
JAM2,
0, BART,
&myfont,
(UBYTE *)fbuf,
&e_text
};
static struct NewWindow newwindow = {
0, /* left edge */
10, /* top edge */
WINW, /* width */
WINH, /* height */
0, /* detail pen */
1, /* block pen */
MENUPICK | NEWSIZE, /* messages */
/* WINDOWDEPTH | WINDOWCLOSE */ /* don't use these gads */
WINDOWDRAG | WINDOWSIZING | NOCAREREFRESH, /* add a few gadgets */
NULL, /* no custom gadgets */
NULL, /* default checkmark */
(UBYTE *)"F", /* title */
NULL, /* initialize this! */
NULL, /* use screen bitmap */
WINW, MINH, WINW, MAXH, /* min and max sizes */
WBENCHSCREEN } ; /* use workbench screen */
void initmenus()
{
(void) InitProjItems(); /* Initialize the menu items */
(void) InitSetupItems();
(void) InitPrioItems();
(void) InitChipItems();
(void) InitChipAItems();
(void) InitSFItems();
(void) InitSFAItems();
(void) InitFastItems();
(void) InitFastAItems();
(void) InitMenu();
(void) StartMenus();
}
void handle_MENUPICK( class, code )
unsigned long class;
unsigned int code;
{
unsigned int menunum, itemnum, subnum;
if (code == MENUNULL) return;
menunum = MENUNUM( code );
itemnum = ITEMNUM( code );
subnum = SUBNUM( code );
chgflag = TRUE;
switch( menunum ) {
case 0:
switch( itemnum ) {
case 0:
WindowToFront(window);
break;
case 1:
WindowToBack(window);
break;
case 2:
things_are_cool = FALSE; /* Quit */
break;
} /* end of switch ( Project itemnum ) */
break;
case 1:
switch( itemnum ) {
case 0:
switch( subnum ) {
case 0:
mode = FRAGS ; /* Frags mode */
break;
case 1:
mmode = TRUE ; /* Warps request */
break;
/* end of switch ( Mode subnum ) */
}
break;
case 1:
switch( subnum ) {
case 0:
delayval = 1;
break;
case 1:
delayval = 2;
break;
case 2:
delayval = 5;
break;
case 3:
delayval = 10;
break;
/* end of switch ( Freq subnum ) */
}
break;
/* end of switch ( Setup itemnum ) */
}
break;
case 2:
switch( itemnum ) {
case 0:
priority = lastpri;
break;
case 1:
priority = priority - 1;
break;
case 2:
priority = priority + 1;
break;
case 3:
priority = -99;
lastpri = priority;
break;
case 4:
priority = -75;
lastpri = priority;
break;
case 5:
priority = -50;
lastpri = priority;
break;
case 6:
priority = -25;
lastpri = priority;
break;
case 7:
priority = -20;
lastpri = priority;
break;
case 8:
priority = -15;
lastpri = priority;
break;
case 9:
priority = -10;
lastpri = priority;
break;
case 10:
priority = -5;
lastpri = priority;
break;
case 11:
priority = 0;
lastpri = priority;
break;
case 12:
priority = 5;
lastpri = priority;
break;
case 13:
priority = 10;
lastpri = priority;
break;
case 14:
priority = 15;
lastpri = priority;
break;
case 15:
priority = 20;
lastpri = priority;
break;
}
/* end of switch ( Priority itemnum ) */
break;
case 3:
switch( itemnum ) {
case 0:
cmemsize = 0x000000;
break;
case 1:
cmemsize = 0x040000;
break;
case 2:
cmemsize = 0x080000;
break;
case 3:
cmemsize = 0x100000;
break;
case 4:
cmemsize = 0x200000;
break;
}
/* end of switch ( Chip Size itemnum ) */
break;
case 4:
switch( itemnum ) {
case 0:
cmembase = 0x000000;
break;
case 1:
cmembase = 0x040000;
break;
case 2:
cmembase = 0x080000;
break;
case 3:
cmembase = 0x100000;
break;
}
/* end of switch ( Chip Addr itemnum ) */
break;
case 5:
if (mode == WARPS) mmode = TRUE ;
switch( itemnum ) {
case 0:
sfmemsize = 0x000000;
break;
case 1:
sfmemsize = 0x040000;
break;
case 2:
sfmemsize = 0x080000;
break;
case 3:
sfmemsize = 0x0C0000;
break;
case 4:
sfmemsize = 0x100000;
break;
case 5:
sfmemsize = 0x180000;
break;
case 6:
sfmemsize = 0x200000;
break;
case 7:
sfmemsize = 0x300000;
break;
case 8:
sfmemsize = 0x400000;
break;
case 9:
sfmemsize = 0x600000;
break;
case 10:
sfmemsize = 0x800000;
break;
}
/* end of switch ( SF Size itemnum ) */
break;
case 6:
if (mode == WARPS) mmode = TRUE ;
switch( itemnum ) {
case 0:
sfmembase = 0x200000;
break;
case 1:
sfmembase = 0x240000;
break;
case 2:
sfmembase = 0x280000;
break;
case 3:
sfmembase = 0x2C0000;
break;
case 4:
sfmembase = 0x300000;
break;
case 5:
sfmembase = 0x400000;
break;
case 6:
sfmembase = 0x500000;
break;
case 7:
sfmembase = 0x600000;
break;
case 8:
sfmembase = 0x700000;
break;
case 9:
sfmembase = 0x800000;
break;
case 10:
sfmembase = 0x900000;
break;
case 11:
sfmembase = 0xC00000;
break;
case 12:
sfmembase = 0xC40000;
break;
case 13:
sfmembase = 0xC80000;
break;
case 14:
sfmembase = 0xCC0000;
break;
case 15:
sfmembase = 0xD00000;
break;
}
/* end of switch ( SF Addr itemnum ) */
break;
case 7:
if (mode == WARPS) mmode = TRUE ;
switch( itemnum ) {
case 0:
fmemsize = 0x000000;
break;
case 1:
fmemsize = 0x040000;
break;
case 2:
fmemsize = 0x080000;
break;
case 3:
fmemsize = 0x0C0000;
break;
case 4:
fmemsize = 0x100000;
break;
case 5:
fmemsize = 0x200000;
break;
case 6:
fmemsize = 0x300000;
break;
case 7:
fmemsize = 0x400000;
break;
case 8:
fmemsize = 0x600000;
break;
case 9:
fmemsize = 0x800000;
break;
case 10:
fmemsize = 0xa000000;
break;
case 11:
fmemsize = 0xc00000;
break;
case 12:
fmemsize = 0xd00000;
break;
case 13:
fmemsize = 0xe00000;
break;
case 14:
fmemsize = 0xf00000;
break;
case 15:
fmemsize = 0x1000000;
break;
}
/* end of switch ( Fast Size itemnum ) */
break;
case 8:
if (mode == WARPS) mmode = TRUE ;
switch( itemnum ) {
case 0:
fmembase = 0x200000;
break;
case 1:
fmembase = 0x300000;
break;
case 2:
fmembase = 0x400000;
break;
case 3:
fmembase = 0x500000;
break;
case 4:
fmembase = 0x600000;
break;
case 5:
fmembase = 0x800000;
break;
case 6:
fmembase = 0x7f0000;
break;
case 7:
fmembase = 0x7e0000;
break;
case 8:
fmembase = 0x7d00000;
break;
case 9:
fmembase = 0x7c00000;
break;
case 10:
fmembase = 0x7a00000;
break;
case 11:
fmembase = 0x7800000;
break;
case 12:
fmembase = 0x7600000;
break;
case 13:
fmembase = 0x7400000;
break;
case 14:
fmembase = 0x7200000;
break;
case 15:
fmembase = 0x7000000;
break;
}
/* end of switch ( Fast Addr itemnum ) */
break;
}
/* end of switch ( menunum ) */
}
void wrack_sploot() /* this subprogram cashes in the chips in bad times */
{
if (log != 0) {
if (log & SA) {
(void) FreeMem(oldcsum, (long)(sizeof(ULONG) * warps)) ;
log = log & CA ;
}
if (log & S8) {
(void) FreeMem(csum, (long)(sizeof(ULONG) * warps)) ;
log = log & C8 ;
}
if (log & S4) {
(void) FreeMem(sizev, (long)(sizeof(long) * frags)) ;
log = log & C4 ;
}
if (log & S2) {
(void) FreeMem(chunkv, (long)(sizeof(long) * frags)) ;
log = log & C2 ;
}
if (log & S1) {
(void) FreeMem(cell, (long)(sizeof(USHORT) * warps)) ;
log = log & C1 ;
}
frags = 0;
warps = 0;
}
}
SetTimer(sec, micro, timermsg)
ULONG sec, micro;
struct IOStdReq *timermsg;
/* This routine simply sets the timer to interrupt us after secs.micros */
{
timermsg->io_Command = TR_ADDREQUEST; /* add a new timer request */
timermsg->io_Actual = sec; /* seconds */
timermsg->io_Length = micro; /* microseconds */
SendIO(timermsg); /* post a request to the timer */
}
void cleanup() {
if (timerport) {
Wait(timerbit);
GetMsg(timerport);
CloseDevice(timermsg);
DeleteStdIO(timermsg);
DeletePort(timerport);
}
if (GfxBase) CloseLibrary(GfxBase) ;
if (window) CloseWindow(window) ;
if (IntuitionBase) CloseLibrary(IntuitionBase) ;
wrack_sploot() ;
exit(AARRRGH) ;
}
void inittimer() {
if(!(timerport = (struct MsgPort *)CreatePort(0L, 0L)))cleanup();
if(!(timermsg = (struct IOStdReq *)CreateStdIO(timerport)))cleanup();
if (OpenDevice(TIMERNAME, UNIT_VBLANK, timermsg, 0L))cleanup();
timerbit = 1L << timerport->mp_SigBit ;
SetTimer(1L, 0L, timermsg); /* set for first message */
}
void handle_NEWSIZE() /* short term allocations cashed in then realloc'd */
{ /* when user hits gadget but doesn't resize window */
if (log & SA) {
(void) FreeMem(oldcsum, (long)(sizeof(ULONG) * warps)) ;
log = log & CA ;
}
if (log & S8) {
(void) FreeMem(csum, (long)(sizeof(ULONG) * warps)) ;
log = log & C8 ;
}
if (log & S1) {
(void) FreeMem(cell, (long)(sizeof(USHORT) * warps)) ;
log = log & C1 ;
barh = window->Height - SIZEGAD - DRAGBAR ; /* recalculate height */
barb = window->Height - SIZEGAD - 1 ; /* get new bar base position */
warps = barh + 1 ; /* number of storage cells to be reserved */
if ((cell = (USHORT *)AllocMem((long)sizeof(USHORT) * warps,
MEMF_PUBLIC)) != 0L ) log = log | S1;
if ((csum = (ULONG *)AllocMem((long)sizeof(ULONG) * warps,
MEMF_PUBLIC)) != 0L ) log = log | S8;
if ((oldcsum = (ULONG *)AllocMem((long)sizeof(ULONG) * warps,
MEMF_PUBLIC)) != 0L ) log = log | SA;
if (log != SOK) { /* bail out if we didn't get an allocation */
wrack_sploot() ;
things_are_cool = FALSE ; /* tell _main that we're leaving */
}
e_text.TopEdge = barb + BORDER ; /* set the E text position */
intsig = FALSE ;
}
}
void handle_MESSAGES() {
unsigned long class;
unsigned int code, qual;
/* Wait (1L << window->UserPort->mp_SigBit); this is rediculous! */
while ((message=(struct IntuiMessage *)GetMsg(window->UserPort))
!= 0L) {
class = message->Class ;
code = message->Code ;
qual = message->Qualifier ;
ReplyMsg ;
ticker = 0 ; /* cut short the timer to expedite service */
switch( class ) {
case MENUPICK:
handle_MENUPICK( class, code ) ; /* do menus ASAP */
break ;
case NEWSIZE:
intsig = TRUE ; /* resize when done here */
break ;
}
}
}
void memmometer() /* this subprogram draws the bar graphs */
{
long i;
long y;
(void) handle_MESSAGES() ; /* go see if the user wants anything */
i = 0 ;
while ((i < barh) && (intsig == FALSE)) {
y = barb - i ;
SetAPen(window->RPort, (long)cell[i]);
Move(window->RPort, xl, y);
Draw(window->RPort, xr, y);
i++ ;
}
}
void shake() /* this subprogram slings down the mercury column */
{
int i;
for (i = 0; i < barh; i++) {
cell[i] = YELP ;
}
}
void lockout() /* this subprogram renders a whole column in border colors */
{
(void) handle_MESSAGES() ; /* go see if the user wants anything */
if (intsig == FALSE) {
SetAPen(window->RPort, WHTP) ; /* set in the border color */
RectFill(window->RPort, xl, (barb - barh + 1), xr, barb) ; /* fill */
}
}
void updatewarps( wf, membase, memseg ) /* this subprogram finds changes */
short wf;
long membase, memseg ;
{
register long i ;
register ULONG r ;
register ULONG delta ;
register ULONG *a ;
if (memseg == 0) {
(void) lockout() ;
return ;
}
else (void) shake() ;
delta = (ULONG)(memseg & EVENMASK) ; /* try to avoid odd address trap */
r = (ULONG)(membase & EVENMASK) ; /* prefer wrong address to death */
for (i = 0; i < barh; i++) {
csum[i] = 0 ;
}
for (i = 0; i < barh; i++) {
for (a = (ULONG *)r; a < (ULONG *)(r + delta); a++) {
csum[i] ^= *a ;
}
if (oldcsum[i] != 0) cell[i] ^= GRNP ; /* enters with pens */
if (csum[i] == oldcsum[i]) cell[i] &= GRNP ; /* all on, condition */
if (csum[i] == 0) cell[i] ^= CYNP ; /* detected clears a */
if (oldcsum[i] == 0xffffffff) cell[i] = CYNP ;/* pen; at the end a */
if (csum[i] == 0xffffffff) cell[i] = GRNP ; /* logical true sets */
oldcsum[i] = csum[i] ; /* a pen not yet set */
r += delta ;
}
(void) memmometer();
}
void updatescreen( wf, membase, memseg )
short wf;
long membase, memseg;
{
register long size ;
register struct MemHeader *hdr ;
register struct MemChunk *chunk ;
extern struct ExecBase *SysBase ;
register long *which ; /* active memlist chunk pointer */
register long newlimit ; /* number of chunks, incl 1 null chunk, + 1 */
register long newfrags ; /* number of chunks, incl null chunks, + 1 */
long newsize ; /* size of next request for chunkv/sizev memory, + 1 */
int i, j, k, l ;
int length ; /* length is number of chunks to be processed, + 1 */
BOOL cf, nf ; /* cf is "chip flag" nf is "null chunk found" flag */
if (memseg == 0) {
(void) lockout() ;
return;
}
else (void) shake() ;
for (i = 0; i < 3; i++) {
chip[i] = 0;
fast[i] = 0;
}
for (i = 0; i < frags; i++) {
chunkv[i] = 0;
sizev[i] = 0;
}
newfrags = 0 ;
newlimit = 0 ;
nf = FALSE;
Forbid() ;
hdr = (struct MemHeader *) SysBase->MemList.lh_Head ;
while (hdr->mh_Node.ln_Succ) {
if (hdr->mh_Attributes & MEMF_CHIP) {
which = chip ;
cf = TRUE;
}
else {
which = fast ;
cf = FALSE;
}
if (((cf == TRUE) && (wf == 0)) || ((cf == FALSE) && (wf > 0))) {
for (chunk = hdr->mh_First; chunk; chunk = chunk->mc_Next) {
if (which[1] < frags) chunkv[which[1]++] = (unsigned long)chunk ;
size = chunk->mc_Bytes ;
if (which[2] < frags) sizev[which[2]++] = (unsigned long)size;
*which += size ;
if (nf == FALSE) {
newlimit++ ;
if (chunkv[newfrags] == NULL) {
nf = TRUE;
}
}
newfrags++ ;
}
}
hdr = (struct MemHeader *)hdr->mh_Node.ln_Succ ;
}
Permit() ;
length = frags ;
if (newlimit < frags) length = newlimit ;
for (i = 0; i < length; i++) {
chunkv[i] -= membase; /* chunkv is now array offset from base */
sizev[i] += chunkv[i]; /* and sizev is now address of array top */
chunkv[i] = chunkv[i] / memseg; /* this is the number of pixels */
sizev[i] = sizev[i] / memseg; /* and this is the top pixel */
if (chunkv[i] < 0) chunkv[i] = 0 ; /* we do some bounds checking */
if (sizev[i] < 0) sizev[i] = 0 ;
if (chunkv[i] >= barh) chunkv[i] = barh - 1 ;
if (sizev[i] >= barh) sizev[i] = barh - 1 ;
if (sizev[i] - chunkv[i] < 0) sizev[i] = chunkv[i] ;
j = chunkv[i] ; /* from now on it will be less confusing if */
k = sizev[i] ; /* we assign some variables for this stuff */
if (sizev[i] - chunkv[i] == 0) {
cell[j] &= BLUP ;
}
else {
for (l = j; l < k; l++) {
cell[l] &= BLKP ;
}
}
}
(void) memmometer();
newsize = frags ;
while (newsize < newlimit) {
newsize += EXTENSION ;
}
if (newlimit > frags) {
(void) FreeMem(chunkv, (long)(sizeof(long) * frags));
if ((chunkv = (unsigned long *)AllocMem((long)sizeof(long) * newsize,
MEMF_PUBLIC)) == 0L ) {
log = log & C2 ;
}
(void) FreeMem(sizev, (long)(sizeof(long) * frags));
if ((sizev = (unsigned long *)AllocMem((long)sizeof(long) * newsize,
MEMF_PUBLIC)) == 0L ) {
(void) FreeMem(chunkv, (long)(sizeof(long) * newsize));
log = log & C4 ;
}
if (log != SOK) {
wrack_sploot() ;
things_are_cool = FALSE ;
}
else frags = newsize ;
}
}
main() {
static struct IntuiText bodyText0 =
{BLUP, WHTP, JAM2, 58, 10, NULL, NULL, NULL};
static struct IntuiText bodyText1 =
{BLUP, WHTP, JAM2, 42, 20, NULL, NULL, NULL};
static struct IntuiText bodyText2 =
{BLUP, WHTP, JAM2, 50, 30, NULL, NULL, NULL};
static struct IntuiText positiveText =
{BLUP, WHTP, JAM2, 7, 3, NULL, NULL, NULL};
static struct IntuiText negativeText =
{BLUP, WHTP, JAM2, 7, 3, NULL, NULL, NULL};
struct IntuiMessage *message;
ULONG class;
USHORT code;
ULONG wakeupbits;
long syspri;
char *nptr;
struct Task *mmtcb;
char oldpri;
int t;
int i;
USHORT colflags; /* keeps track of column positions and counts */
USHORT left; /* left column, left edge */
USHORT middle; /* middle column, left edge */
USHORT right; /* right column, left edge */
USHORT barw; /* width of each mercury column */
USHORT wf; /* memmometer window current column number */
long cmemseg;
long sfmemseg;
long fmemseg;
long membase;
long memseg;
long memsize;
bodyText0.IText = (UBYTE *) "WARNING! CRASH POSSIBLE";
bodyText1.IText = (UBYTE *) "MENU MEMORY SELECTIONS MUST";
bodyText2.IText = (UBYTE *) "REFERENCE EXISTING MEMORY";
bodyText0.NextText = &bodyText1;
bodyText1.NextText = &bodyText2;
positiveText.IText = (UBYTE *) "Risk It";
negativeText.IText = (UBYTE *) "Retreat";
log = 0 ;
if ((cell = (USHORT *)AllocMem((long)sizeof(USHORT) * BARS,
MEMF_PUBLIC)) != 0L ) log = log | S1;
if ((chunkv = (ULONG *)AllocMem((long)sizeof(ULONG) * STARTVAL,
MEMF_PUBLIC)) != 0L ) log = log | S2;
if ((sizev = (ULONG *)AllocMem((long)sizeof(ULONG) * STARTVAL,
MEMF_PUBLIC)) != 0L ) log = log | S4;
if ((csum = (ULONG *)AllocMem((long)sizeof(ULONG) * BARS,
MEMF_PUBLIC)) != 0L ) log = log | S8;
if ((oldcsum = (ULONG *)AllocMem((long)sizeof(ULONG) * BARS,
MEMF_PUBLIC)) != 0L ) log = log | SA;
if (log != SOK) {
wrack_sploot() ;
exit(AARRRGH) ;
}
if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary(
"intuition.library",33L)) != NULL &&
(window=OpenWindow(&newwindow)) != NULL) {
if ((GfxBase = (struct GfxBase *)OpenLibrary(
"graphics.library", 0L)) != NULL) {
(void) initmenus();
/* rp = window->RPort ; */
inittimer();
wf = 0;
mmode = FALSE ;
mode = FRAGS ;
delayval = p_rate ;
priority = p_priority ;
if (priority > 0) priority = 0 ;
lastpri = priority ;
syspri = priority ;
nptr = NULL ;
mmtcb = FindTask( nptr ) ;
oldpri = SetTaskPri( mmtcb, syspri ) ;
cmemsize = p_chip << 10 ;
cmembase = p_chipa << 10 ;
sfmemsize = p_sf << 10 ;
sfmembase = p_sfa << 10 ;
if (p_fast >= 256) fmemsize = p_fast << 10 ;
else fmemsize = p_fast << 20 ;
if (p_fasta <= 0) fmembase = 0x8000000 - ((-1 * p_fasta) << 20) ;
else fmembase = p_fasta << 20 ;
while (things_are_cool == TRUE) {
if (chgflag != 0) {
chgflag = 0 ;
colflags = 0 ;
if (cmemsize != 0) colflags = colflags | (1 << 0) ;
if (sfmemsize != 0) colflags = colflags | (1 << 1) ;
if (fmemsize != 0) colflags = colflags | (1 << 2) ;
switch ( colflags ) {
case 0:
barw = (WINW - (2 * BORDER)) - 1 ;
left = LEFT ;
middle = 0 ;
right = 0 ;
f_text.FrontPen = ORNP ;
break ;
case 1:
barw = (WINW - (2 * BORDER)) - 1 ;
left = LEFT ;
middle = 0 ;
right = 0 ;
f_text.FrontPen = BLUP ;
break ;
case 2:
barw = (WINW - (2 * BORDER)) - 1 ;
left = 0 ;
middle = LEFT ;
right = 0 ;
f_text.FrontPen = CYNP ;
break ;
case 3:
barw = ((WINW - (2 * BORDER)) / 2 ) - 1 ;
left = LEFT ;
middle = (left + barw + 1) ;
right = 0 ;
f_text.FrontPen = BLUP ;
break ;
case 4:
barw = (WINW - (2 * BORDER)) - 1 ;
left = 0 ;
middle = 0;
right = LEFT ;
f_text.FrontPen = YELP ;
break ;
case 5:
barw = ((WINW - (2 * BORDER)) / 2 ) - 1 ;
left = LEFT ;
middle = 0 ;
right = (left + barw + 1) ;
f_text.FrontPen = CYNP ;
break ;
case 6:
barw = ((WINW - (2 * BORDER)) / 2 ) - 1 ;
left = 0 ;
middle = LEFT ;
right = (middle + barw + 1) ;
f_text.FrontPen = YELP ;
break ;
case 7:
barw = ((WINW - (2 * BORDER)) / 3 ) - 1 ;
left = LEFT ;
middle = (left + barw + 1) ;
right = (middle + barw + 1) ;
f_text.FrontPen = BLUP ;
break ;
} /* end of switch ( colflags ) */
} /* end of if ( chgflag ) */
cmemseg = cmemsize / barh ;
sfmemseg = sfmemsize / barh ;
fmemseg = fmemsize / barh ;
if (mmode == TRUE && ((sfmemsize != 0) ||
(fmemsize != 0))) {
/* Keep your eyes open here. If we get a negative */
/* response from the requester, that means either the */
/* user retreated, or a no-requester function such as */
/* noreq or KillReq has selected the negative option. */
/* If such functions select the positive option they */
/* force acceptance of the crash risk for Warps mode. */
mode = AutoRequest(window, &bodyText0, &positiveText,
&negativeText, 0L, 0L, 319L, 79L) ;
if (mode == FALSE) { /* user Retreat selection */
sfmemseg = 0 ; /* results in execution of */
sfmemsize = 0 ; /* this code segment which */
fmemseg = 0 ; /* resets to safer values */
fmemsize = 0 ; /* resets to safer values */
}
}
switch ( wf ) {
case 0:
xl = left ;
membase = cmembase ;
memseg = cmemseg ;
memsize = cmemsize ;
break;
case 1:
xl = middle ;
membase = sfmembase ;
memseg = sfmemseg ;
memsize = sfmemsize ;
break;
case 2:
xl = right ;
membase = fmembase ;
memseg = fmemseg ;
memsize = fmemsize ;
break;
} /* end of switch ( wf ) */
xr = xl + barw ;
if (mmode == TRUE) {
mode = WARPS ;
mmode = FALSE ;
}
if (xl != 0) {
if (intsig == TRUE) {
handle_NEWSIZE() ;
}
if (mode == WARPS) {
(void) updatewarps( wf, membase, memseg ) ;
e_text.FrontPen = YELP ;
}
if (mode == FRAGS) {
(void) updatescreen( wf, membase, memseg ) ;
e_text.FrontPen = BLUP ;
}
}
if (syspri != priority) {
syspri = priority ;
nptr = NULL;
mmtcb = FindTask( nptr ) ;
oldpri = SetTaskPri( mmtcb, syspri ) ;
}
if (wf == 2) {
PrintIText(window->RPort,&f_text,RTEXT,0L) ;
while ( ticker > 0 ) {
wakeupbits = Wait(timerbit) ;
if (wakeupbits & timerbit) {
GetMsg(timerport);
SetTimer(0L, TMARK, timermsg);
}
/* quick like, go see if the user wants anything */
(void) handle_MESSAGES() ;
ticker-- ;
}
ticker = delayval * TICKIES ;
}
wf++ ;
if (wf >= 3) wf = 0 ;
if (intsig == TRUE) {
handle_NEWSIZE() ;
}
} /* end of while ( things_are_cool) */
if (timerport) {
Wait(timerbit);
GetMsg(timerport);
CloseDevice(timermsg);
DeleteStdIO(timermsg);
DeletePort(timerport);
}
if (GfxBase) CloseLibrary(GfxBase) ;
}
if (window) CloseWindow(window) ;
if (IntuitionBase) CloseLibrary(IntuitionBase) ;
}
wrack_sploot() ;
}
_cli_parse() {}
_wb_parse() {}